#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main()
{
    pid_t pid;//process ID
    printf("Before fork,PID=%d,PPID=%d.\n",getpid(),getppid());

    pid = fork();//创建子进程
    //fork之前的代码会被执行一次，后面的代码会被父进程和子进程分别执行
    if(pid == -1)
    {
        perror("failed in calling fork");
        exit(1);
    }
    else if(pid == 0)
    {
        printf("in child process,child's PID=%d,PPID=%d.\n",getpid(),getppid());
        // ---------------A------------------
        sleep(3);//添加该语句，并解释现象:父进程和子进程都睡眠了三秒
        // ---------------B------------------
        //exit(0);//在上面的基础上删掉这行，解释现象：删掉这段代码，子程序没有直接退出，而是打印了pid和ppid后推出
    }
    else
    {
        // the parent process
        printf("in parent process,child's PID=%d.\n",pid);
        printf("in parent process,PID=%d,PPID=%d.\n",getpid(),getppid());
        // ---------------C------------------
        //wait(NULL);//在上面的基础上，删掉这行代码，解释现象：父进程一旦调用了wait就立即阻塞自己，删掉这行代码后，就不会阻塞了
    }
    printf("before return in main(),PID=%d,PPID=%d.\n",getpid(),getppid());
    return (EXIT_SUCCESS);
}
